﻿//-------------------------------------------------------------------
//	Copyright (c) 2010-2014  Zhirnov Andrey
//	This file is part of the "UX Standard Lib" project.
//	See copyright notice in "UX_STL_Ext.h".
//-------------------------------------------------------------------

#include "GLBatchRender.h"

namespace UX_STL
{
namespace GLShell
{

/*
=================================================
	добавляет вершину
=================================================
*/
	void GLBatchRender::Vertex2d(const TVertex2D &sVertex)
	{
		TVertex2D	s_vert(sVertex);

		s_vert.sPos.z = GetCurrentZ();

		AddVertices( &s_vert, sizeof(s_vert) );
	}

/*
=================================================
	добавляет массив вершин
=================================================
*/
	void GLBatchRender::Polygons2d(const TVertex2D *pPolygons, uint uCount)
	{
		TVertex2D	s_vert;

		for (uint i = 0; i < uCount; ++i)
		{
			s_vert		  = pPolygons[i];
			s_vert.sPos.z = GetCurrentZ();

			AddVertices( &s_vert, sizeof(s_vert) );
		}
	}
	
/*
=================================================
	добавляет точку
=================================================
*/
	void GLBatchRender::Point2d(const TVertex2D &sPoint)
	{
		Vertex2d( sPoint );
	}
	
	void GLBatchRender::Point2d(void *pParam, PDrawBatchProc_t pDraw, const TVertex2D &sPoint)
	{
		NewBatchC( pParam, pDraw, gl_primitive::POINT, _uDefault2DBatch, GetCurrentZ() );
		Point2d( sPoint );
	}

/*
=================================================
	добавляет линию
=================================================
*/
	void GLBatchRender::Line2d(const TLine2D &sLine)
	{
		Polygons2d( &sLine.sPoint0, 2 );
	}

	void GLBatchRender::Line2d(void *pParam, PDrawBatchProc_t pDraw, const TLine2D &sLine)
	{
		NewBatchC( pParam, pDraw, gl_primitive::LINE, _uDefault2DBatch, GetCurrentZ() );
		Line2d( sLine );
	}
	
/*
=================================================
	добавляет линии
=================================================
*/
	void GLBatchRender::Lines2d(const TLine2D *pLines, uint uCount)
	{
		Polygons2d( &pLines[0].sPoint0, uCount << 1 );
	}

	void GLBatchRender::Lines2d(void *pParam, PDrawBatchProc_t pDraw, const TLine2D *pLines, uint uCount)
	{
		NewBatchC( pParam, pDraw, gl_primitive::LINE, _uDefault2DBatch, GetCurrentZ() );
		Lines2d( pLines, uCount );
	}
	
/*
=================================================
	добавляет линии
=================================================
*/
	void GLBatchRender::Lines2dS(const TVertex2D *pPoints, uint uCount)
	{
		Polygons2d( pPoints, uCount );
	}

	void GLBatchRender::Lines2dS(void *pParam, PDrawBatchProc_t pDraw, const TVertex2D *pPoints, uint uCount)
	{
		NewBatch( pParam, pDraw, gl_primitive::LINE_STRIP, _uDefault2DBatch, GetCurrentZ() );
		Lines2dS( pPoints, uCount );
	}
	
/*
=================================================
	добавляет треугольник
=================================================
*/
	void GLBatchRender::Triangle2d(const TTriangle2D &sTriangle)
	{
		Polygons2d( &sTriangle.sPoint0, 3 );
	}

	void GLBatchRender::Triangle2d(void *pParam, PDrawBatchProc_t pDraw, const TTriangle2D &sTriangle)
	{
		NewBatchC( pParam, pDraw, gl_primitive::TRIANGLE, _uDefault2DBatch, GetCurrentZ() );
		Triangle2d( sTriangle );
	}
	
/*
=================================================
	добавляет четырехугольник
=================================================
*/
	void GLBatchRender::Rect2d(const TRect2D &sRect)
	{
		TRect2D_6p	s_rect( sRect );
		Polygons2d( &s_rect.sTriangle0.sPoint0, 6 );
	}

	void GLBatchRender::Rect2d(void *pParam, PDrawBatchProc_t pDraw, const TRect2D &sRect)
	{
		NewBatch( pParam, pDraw, gl_primitive::TRIANGLE, _uDefault2DBatch, GetCurrentZ() );
		Rect2d( sRect );
	}
	
/*
=================================================
	добавляет квадрат
=================================================
*/
	void GLBatchRender::Quad2dT(const TQuad2D &sQuad)
	{
		Rect2d( TRect2D( sQuad ) );
	}

	void GLBatchRender::Quad2dT(void *pParam, PDrawBatchProc_t pDraw, const TQuad2D &sQuad)
	{
		Rect2d( pParam, pDraw, TRect2D( sQuad ) );
	}
	
/*
=================================================
	добавляет точку, из которой в геометрическом
	шейдере строится квадрат
=================================================
*/
	void GLBatchRender::Quad2dG(const TQuad2D &sQuad)
	{
		TQuad2D	s_quad(sQuad);
		s_quad.fDepth = GetCurrentZ();
		
		AddVertices( &s_quad, sizeof(s_quad) );
	}

	void GLBatchRender::Quad2dG(void *pParam, PDrawBatchProc_t pDraw, const TQuad2D &sQuad)
	{
		NewBatchC( pParam, pDraw, gl_primitive::POINT, _uDefault2DGSBatch, GetCurrentZ() );
		Quad2dG( sQuad );
	}
	
/*
=================================================
	добавляет четырехугольник
=================================================
*/
	void GLBatchRender::Rect2dS(const TRect2D &sRect)
	{
		Polygons2d( &sRect.sPoint0, 4 );
	}

	void GLBatchRender::Rect2dS(void *pParam, PDrawBatchProc_t pDraw, const TRect2D &sRect)
	{
		NewBatch( pParam, pDraw, gl_primitive::TRIANGLE_STRIP, _uDefault2DBatch, GetCurrentZ() );
		Rect2dS( sRect );
	}
	
/*
=================================================
	добавляет квадрат
=================================================
*/
	void GLBatchRender::Quad2dS(const TQuad2D &sQuad)
	{
		Rect2dS( TRect2D( sQuad ) );
	}

	void GLBatchRender::Quad2dS(void *pParam, PDrawBatchProc_t pDraw, const TQuad2D &sQuad)
	{
		Rect2dS( pParam, pDraw, TRect2D( sQuad ) );
	}

/*
=================================================
	добавляет квадрат, с учетом вырезки
=================================================
*/
	void GLBatchRender::ScissorQuad2dG(const TQuad2D &sQuad)
	{
		TQuad2D		s_quad( sQuad );
		
		if ( !_bScissor or GetScissor().CropRect( s_quad.sRect ) )
		{
			Quad2dG( s_quad );
		}
	}

	void GLBatchRender::ScissorQuad2dG(void *pParam, PDrawBatchProc_t pDraw, const TQuad2D &sQuad)
	{
		TQuad2D		s_quad( sQuad );
		
		if ( !_bScissor or GetScissor().CropRect( s_quad.sRect ) )
		{
			Quad2dG( pParam, pDraw, s_quad );
		}
	}

/*
=================================================
	добавляет квадрат, с учетом вырезки
=================================================
*/
	void GLBatchRender::ScissorQuad2dT(const TQuad2D &sQuad)
	{
		TQuad2D		s_quad( sQuad );
		
		if ( !_bScissor or GetScissor().CropRect( s_quad.sRect ) )
		{
			Quad2dT( s_quad );
		}
	}

	void GLBatchRender::ScissorQuad2dT(void *pParam, PDrawBatchProc_t pDraw, const TQuad2D &sQuad)
	{
		TQuad2D		s_quad( sQuad );
		
		if ( !_bScissor or GetScissor().CropRect( s_quad.sRect ) )
		{
			Quad2dT( pParam, pDraw, s_quad );
		}
	}
		
/*
=================================================
	добавляет квадрат, с учетом вырезки
=================================================
*/
	void GLBatchRender::ScissorQuad2dS(const TQuad2D &sQuad)
	{
		TQuad2D		s_quad( sQuad );
		
		if ( !_bScissor or GetScissor().CropRect( s_quad.sRect ) )
		{
			Quad2dS( s_quad );
		}
	}

	void GLBatchRender::ScissorQuad2dS(void *pParam, PDrawBatchProc_t pDraw, const TQuad2D &sQuad)
	{
		TQuad2D		s_quad( sQuad );
		
		if ( !_bScissor or GetScissor().CropRect( s_quad.sRect ) )
		{
			Quad2dS( pParam, pDraw, s_quad );
		}
	}

//-------------------------------------------------------------------

}	// GLShell
}	// UX_STL
